/*
 * ----------------------------------------------------------------
 *  FECHA      HORA   NOMBRE    COMENTARIO
 * ----------------------------------------------------------------
 *  09/05/08   18:44  DAVID     Creación de clase y algunos metodos
 *  08/05/08   17:30  DAVID     Creación de interface
 *  02/06/08   17:50  JAVI      Métodes persistents.(serializes)
 *
 */

package net.ieslaferreria.infoCiutat;

import java.util.Calendar;
import java.util.Date;
import org.garret.perst.IInputStream;
import org.garret.perst.IOutputStream;
import org.garret.perst.Persistent;

/** 
 * 
 * @author David Maqueda, Javi Xaranda, Alex Fernández, Sergio Soria.
 */
public class XarxaImpl extends Persistent implements Xarxa {
    
    /*
     * Variable que conté el codi de la xarxa.
     */
    private int codi;
    /*
     * Variable que conté el nom de la xarxa.
     */
    private String nom;
    /*
     * Variable que conté si la xarxa implica esforç físic o no.
     */
    private boolean esforçFisic;
    /*
     * Variable que conté si la xarxa es subterrania o no.
     */
    private boolean subterrani;
    /*
     * Variable que conté el cost de viatjar per aquella xarxa.
     */
    private int preu;
    /*
     * Variable que conté la velocitat mitja a la que circula la xarxa.
     */
    private int velocitat;
    /*
     * Variable que conté el temps máxim que esperarem per poder viatjar
     * per la xarxa entre setmana.
     */
    private int tempsEspera;
    /*
     * Variable que conté el temps máxim que esperarem per poder viatjar
     * per la xarxa en cap de setmana.
     */
    private int tempsEsperaCapSetmana;
    /*
     * Variable que conté la hora a la que s'inicia el servei de la xarxa entre
     * setmana.
     */
    private int horaInici;
    /*
     * Variable que conté la hora a la que s'inicia el servei de la xarxa els
     * caps de setmana.
     */
    private int horaIniciCapSetmana;
    /*
     * Variable que conté la hora a la que s'acaba el servei de la xarxa entre
     * setmana.
     */
    private int horaFi;
    /*
     * Variable que conté la hora a la que s'acaba el servei de la xarxa els
     * caps de setmana.
     */
    private int horaFiCapSetmana;
    /*
     * Variable que conté la prioritat que tindrà la xarxa sobre d'altres.
     */
    private int prioritat=3;
    /*
     * Variable que conté el nom de la linia.
     */
    private String nomLinia;
    /*
     * Variable que conté el codi de la linia.
     */
    private int codiLinia;
    
    public XarxaImpl(){
        
    }
    
    public void writeObject(IOutputStream out) { 
        out.writeInt(codi);
        out.writeString(nom);
        out.writeBoolean(esforçFisic);
        out.writeBoolean(subterrani);
        out.writeInt(preu);
        out.writeInt(velocitat);
        out.writeInt(tempsEspera);
        out.writeInt(tempsEsperaCapSetmana);
        out.writeInt(horaInici);
        out.writeInt(horaIniciCapSetmana);
        out.writeInt(horaFi);
        out.writeInt(horaFiCapSetmana);
        out.writeInt(prioritat);
        out.writeString(nomLinia);
        out.writeInt(codiLinia);
        
    }
    
    public void readObject(IInputStream in){
       codi = in.readInt();
       nom = in.readString();
       esforçFisic = in.readBoolean(); 
       subterrani = in.readBoolean();                
       preu = in.readInt();
       velocitat = in.readInt(); 
       tempsEspera = in.readInt();
       tempsEsperaCapSetmana = in.readInt();
       horaInici = in.readInt(); 
       horaIniciCapSetmana = in.readInt(); 
       horaFi = in.readInt();
       horaFiCapSetmana= in.readInt(); 
       prioritat = in.readInt(); 
       nomLinia = in.readString();
       codiLinia = in.readInt();
    }
    
    public int getCodiLinia(){
        return this.codiLinia;
    }
    
    public String getNomLinia(){
        return this.nomLinia;
    }

    public int getCodi() {
        return this.codi;
    }

    public String getNom() {
        return this.nom;
    }

    public int getVelocitat() {
        return this.velocitat;
    }

    public int getTemps(int diaSetmana) {
        int ret = this.tempsEspera;
        if(diaSetmana < 5){
            ret = this.tempsEsperaCapSetmana;
        }
        return ret;
    }

    public int getPreu() {
        return this.preu;
    }

    public int getPrioritat() {
        return this.prioritat;
    }

    public boolean esEnHora(int min) {
        boolean ret = false;
        if (this.esCapSetmana(this.convEnDate(min)) && this.horaIniciCapSetmana < min && this.horaFiCapSetmana > min){
            ret = true;
        }else if (!this.esCapSetmana(this.convEnDate(min)) && 
                this.horaInici < min && this.horaFi > min){
            ret = true;
        }
        return ret;
    }
    

    public boolean esSubterrani() {
        return this.subterrani;
    }

    public boolean hiHaEsforçFisic() {
        return this.esforçFisic;
    }

    public boolean esCapSetmana(Date data){
        boolean ret = false;
        Calendar cal = Calendar.getInstance();
        cal.setTime(data);
        if (cal.DAY_OF_WEEK == 6 || cal.DAY_OF_WEEK == 7){
            ret = true;
        }
        return ret;
    }
    
    public void setVelocitat(int velocitatMitja){
        this.velocitat = velocitatMitja;
    }

    public int getHoraInici(int diaSetmana) {
        int ret = this.horaInici;
        if (diaSetmana > 5){
            ret = this.horaIniciCapSetmana;
        }
        return ret;
    }

    public int getHoraFi(int diaSetmana) {
        int ret = this.horaFi;
        if (diaSetmana > 5){
            ret = this.horaFiCapSetmana;
        }
        return ret;
    }

    public void setCodi(int codi) {
        this.codi = codi;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public void setTempsSetmana(int temps) {
        this.tempsEspera = temps;
    }
    
    public void setTempsCapSetmana(int temps){
        this.tempsEsperaCapSetmana = temps;
    }

    public void setPreu(int preu) {
        this.preu = preu;
    }

    public void setPrioritat(int prioritat) {
        this.prioritat = prioritat;
    }

    public void setSubterrani(boolean subterrani) {
        this.subterrani = subterrani;
    }

    public void setEsforcFisic(boolean esforcFisic) {
        this.esforçFisic = esforcFisic;
    }

    public void setHoraInici(int horaInici) {
        this.horaInici = horaInici;
    }

    public void setHoraFi(int horaFi) {
        this.horaFi = horaFi;
    }

    public void setCodiLinia(int codiLinia) {
        this.codiLinia = codiLinia;
    }

    public void setNomLinia(String linia) {
        this.nomLinia = linia;
    }
    
    /**
     * Converteix els minuts que li passem per parametre en una hora.
     * 
     * @param min
     * @return Date
     */
    private Date convEnDate(int min){
        Date ret = new Date();
        ret.setTime(min*60*1000);
        return ret;
    }
    
    public void setEsforcFisic(String bol){
        if(bol == "1"){
            this.esforçFisic = true;
        }else{
            this.esforçFisic = false;
        }
    }
    
    public void setSubterrani(String bol){
        if(bol == "1"){
            this.subterrani = true;
        }else{
            this.subterrani = false;
        }
    }
    
}
